import { typeCacheApi } from '@/api/cache'
import { UseIsNullRequestParameters, UseLoadingRequestParameters } from '@/interfaces/utils/tools'
import store from '@/store'
import { ref, Ref } from 'vue'

/**
 * @author: 吴宏彬
 * @description: 发起请求，判断请求回来的参数是否为空从而作出提示。请求结束后赋值变量
 * @param {UseLoadingRequestParameters<T[]>} options 必须 函数参数配置
 * @param {Ref<T[]> | undefined | Ref<T>} [options.state] 非必需 请求时想要赋值的参数ref类型
 * @param {AxiosPromise<ResProps<T[]>>} options.axios 必须  axios请求
 * @return {Promise<void>} void
 */
const useIsNullRequest = async <T>({ axios, state }: UseIsNullRequestParameters<T>) => {
  const res = await axios
  if (res.data.data.length === 0) {
    store.state.useMessage?.info('您搜索的数据好像一条都没有诶～')
  }
  state.value = res.data.data
}

/**
 * @author: 吴宏彬
 * @description: 拥有控制loading,赋值ref变量的请求工具
 * @param {UseLoadingRequestParameters<T[]>} options 必须- 函数参数配置
 * @param {Ref<T[]> | undefined | Ref<T>} [options.state] 非必需- 请求时想要赋值的参数ref类型
 * @param {Ref<boolean> | Ref<boolean>[]} options.loadings 必须- ref设置的关于按钮loading的变量
 * @param {AxiosPromise<ResProps<T[]>>} options.axios 必须-  axios请求
 * @return {T} 根据函数的泛型决定返回的类型
 */
const useLoadingRequest = async <T>({ state, axios, loadings }: UseLoadingRequestParameters<T>) => {
  let loadingStates = Array.isArray(loadings) ? loadings : [loadings]

  loadingStates.forEach((item) => {
    item.value = true
  })

  const res = await axios
  if (state) {
    state.value = res.data.data
  }

  loadingStates.forEach((item) => {
    item.value = false
  })

  return res
}

/**
 * @author: 吴宏彬
 * @description: 拥有控制loading,赋值ref变量的请求工具，同时可以判断值数组是否为空
 * @param {UseLoadingRequestParameters<T[]>} options 必须 函数参数配置
 * @param {Ref<T[]> | undefined | Ref<T>} [options.state] 非必需 请求时想要赋值的参数ref类型
 * @param {Ref<boolean> | Ref<boolean>[]} options.loadings 必须 ref设置的关于按钮loading的变量
 * @param {AxiosPromise<ResProps<T[]>>} options.axios 必须  axios请求
 * @return {T} 根据函数的泛型决定返回的类型
 */
const useLoadingRequestOrIsNull = async <T>({
  state,
  axios,
  loadings,
}: UseLoadingRequestParameters<T[]>) => {
  const res = await useLoadingRequest({
    axios,
    state,
    loadings,
  })

  if (res.data.data.length === 0) {
    store.state.useMessage?.info('您搜索的数据好像一条都没有诶～')
  }

  return res
}

/**
 * @description: 请求hooks的工具包
 * @return {Object} 返回所有请求的hooks函数
 */
function useRequest() {
  return {
    useLoadingRequest,
    useIsNullRequest,
    useLoadingRequestOrIsNull,
  }
}

export default useRequest
